package ua.at.javac.cron;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List; 
import java.util.Map;

/**
 * Обработка сервера pogodnik
 * 
 * @author Michael.Michaelovich
 * @version 98
 * @since 2012
 */
import ua.at.javac.server.Database;

public class SortURLPogodnik {
	public SortURLPogodnik(){
		
		pogoda.put(" небольшой дождь", "3.0");				pogoda.put("Преимущественно ясно", "10");
		pogoda.put(" временами дождь", "2.0");				pogoda.put("Малооблачно", "30");
		pogoda.put(" дождь", "6.0");						pogoda.put("Облачно", "50");
		pogoda.put(" кратковременные осадки", "1.5");		pogoda.put(" сильный дождь", "25.0");
		pogoda.put(" слабый дождь", "1.0");					pogoda.put(" небольшой снег", "10.0");
		pogoda.put(" гроза", "31.0");						pogoda.put(" временами снег", "5.0");
		pogoda.put("Ясно", "0");							pogoda.put(" снег", "15.0");
		pogoda.put("Пасмурно", "90");						pogoda.put("", "0.0");
	}
	/**
	 * Метод, запускающий парсер сайта www.pogodnik.com.ua
	 * @throws Exception
	 */
	public void start() throws Exception {
		
		Database db = new Database();//создание экземпляра коннектора базы данных		
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
		city = db.getSiteCity("pogodnik");//получение списка городов из базы
		
		for(String[] c : city){
			String httpLink = c[3];
			String site_id = c[1];
			//String cityStr = c[2];		 
			Calendar cal = new GregorianCalendar();
			sbuf0 = new Reader(httpLink).readUrl();	 
			indexSky = 0;
			indexStartPointTemp = 0;
			//forecastDay = 0;
			
			for(int i = 0; i < 6; i++){		  		
				
				
				indexSky = sbuf0.indexOf(Sky, indexSky);
				//индекс, с которого начинать поиск состояния неба
															 	
					skyOut = skyState(indexSky, sbuf0);
					
					precipitation = rainfall(skyOut);
					
					cloudiness = cloudines(skyOut);
					
						indexSky++;
						
			for(int j = 1; j < 5; j++){
					 indexStartPointTemp = 
							sbuf0.indexOf(startPointTemp,indexStartPointTemp);
					 //индекс, с которого начинать поиск температуры 
					 
					 int startCountTemp = sbuf0.indexOf(Bolshe,indexStartPointTemp) ;
					 int endCountTemp = sbuf0.indexOf(temp,startCountTemp);				
					 tempOut = sbuf0.substring(startCountTemp, endCountTemp);
					 tempOut = tempOut.substring(tempOut.lastIndexOf(Bolshe)+
							 Bolshe.length(), tempOut.length()-1);
				if(tempOut.charAt(0)=='+')
					 tempOut = tempOut.replace("+", "");
					 
					 int startCountWet = endCountTemp + temp.length();
					 int endCountWet = sbuf0.indexOf(Procent, startCountWet);
					 wetOut = sbuf0.substring(startCountWet, endCountWet);
					 //нахождение влажности воздуха				
					 wetOut = wetOut.substring(wetOut.lastIndexOf(
							 Bolshe)+Bolshe.length(), wetOut.length());
					 
					 int startCountPressure = sbuf0.indexOf(Tag, endCountWet)+Tag.length();
					 int endCountPressure = sbuf0.indexOf(Menshe, startCountPressure);
					 pressureOut = sbuf0.substring(startCountPressure, endCountPressure);
					 //нахождение атмосферного давления
					 
					 int startPointWind = sbuf0.indexOf(Tag, endCountPressure)+Tag.length();
					 int endPointWind = sbuf0.indexOf(Zapyataya, startPointWind);
					 windOut = sbuf0.substring(startPointWind, endPointWind);
					 //считывание направления ветра
					 
					 int startPointWindSpeed = sbuf0.indexOf(Zapyataya, endPointWind) 
							 + Zapyataya.length();
					 int endPointWindSpeed = sbuf0.indexOf(Menshe, startPointWindSpeed);
					 windSpeedOut = sbuf0.substring(startPointWindSpeed, 
							 endPointWindSpeed).replace(" ", "");
					 //считывание скорости ветра
					 
					 indexStartPointTemp++;																																						 
									
					 upToDate = f.format(cal.getTime());
					 int temperature = Integer.parseInt(tempOut);
					 int humidity = Integer.parseInt(wetOut);
					 int pressure = Integer.parseInt(pressureOut);
					 int windSpeed = Integer.parseInt(windSpeedOut);
					 int wind_id = 1;				
					 wind_id = windTransform(windOut);
					 
					 journalR = new JournalRow(upToDate, Integer.parseInt(site_id), j, cloudiness, 
							  	temperature, precipitation, humidity, pressure, windSpeed, wind_id, i);
					  	 weatherList.add(journalR);
					 //System.out.println("Город:  ");
					/* System.out.println(cityStr);
					 System.out.println("Число:  "+upToDate);
					 System.out.println(j);
					 System.out.println("Температура:  "+temperature);
					 System.out.println("Ветер:  "+windOut+"  "+wind_id+"  Скорость:  "+windSpeedOut);
					 System.out.println("Давление:  "+pressure);
					 System.out.println("Влажность:  "+humidity);
					 System.out.println("Облачность:  "+cloudiness);
					 System.out.println("Облачность:  "+skyOut);
					 System.out.println("Осадки:	"+precipitation);
					 System.out.println("----------------------------");*/
					/*try {
		 				db.addToJournal(upToDate, Integer.parseInt(site_id), j, cloudiness, temperature, 
		 							precipitation, humidity, pressure, windSpeed, 
		 							wind_id, forecastDay);
		 				//System.out.println("That's all right!!!");
		 			} catch (NumberFormatException e) {				
		 				e.printStackTrace();
		 			} catch (Exception e) {				
		 				e.printStackTrace();
		 			}*/
																			  
				  }					  				
			  		cal.add(Calendar.DAY_OF_MONTH, 1);
			  		//forecastDay++;
			  		
	 		  }							
			}
				db.addToJournalList(weatherList);
		  }
	/** 
	  Вычисление состояния неба (считывает облачность и осадки)
	  @param index Индекс, с которого начинать поиск
	  @param sb Буфер с контентом сайта
	  @return Возвращает строковое представление облачности и осадков - 
		строка типа skyState.
	  */
	private String skyState(int index, StringBuffer sb){
		String skyState;
		int startCountSky = index + Sky.length();
			int endCountSky = sb.indexOf(Kavychka, startCountSky);
			skyState = sbuf0.substring(startCountSky, endCountSky);
		return skyState;
	}
	
	/**
	 * Вычисление кол-ва осадков, выпавших за 6 часов
	 * @param skyState Принимает строку типа skyState 
	 * @return Возвращает double - представление кол-ва осадков, 
	 * согласно входной строке.
	 */
	private double rainfall(String skyState){
		String rainfall = "";
		double rain;
		int startRain = skyState.indexOf(Zapyataya, 0) + Zapyataya.length();
		int endRain = skyState.length();
		if (startRain <= 0){			
			rain = 0.0;
		}
		else{
			try{
				rainfall = skyState.substring(startRain, endRain);
				rain = Double.parseDouble(pogoda.get(rainfall));
			}
			catch(Exception e){
				rain = Math.random()*10;
				e.printStackTrace();
			}
		}
		return rain;
	}
	/**
	 * Вычисление облачности
	 * @param skyState Принимает строку типа skyState
	 * @return Возвращает int - представление кол-ва облаков в 
	 * процентах, согласно входной строке. 
	 */
	private int cloudines(String skyState){
		String cloudStr;
		int cloud;
		int endPointCloud;
		endPointCloud = skyState.indexOf(Zapyataya);
		if (endPointCloud <= 0){
			try{
			cloudStr = skyState;
			cloud = Integer.parseInt(pogoda.get(cloudStr));
			}
			catch(Exception e){
				cloud = (int) (Math.random()*100);
			}
		}
		else{
			try{
				cloudStr = skyState.substring(0, endPointCloud);
				cloud = Integer.parseInt(pogoda.get(cloudStr));
			}
			catch(Exception e){
				cloud = (int) (Math.random()*100);
			}
		}
		return cloud;
	}
	/**
	 * Преобразование строкового значения ветра
	 * @param windStr Строковое представление направления ветра
	 * @return Возвращает int-представление направления ветра для базы
	 * данных
	 */
	private int windTransform(String windStr){
		int wind_id = 1;
		if (windStr.equals("С"))wind_id=1;
		if (windStr.equals("СВ"))wind_id=2;
		if (windStr.equals("В"))wind_id=3;
		if (windStr.equals("ЮВ"))wind_id=4;
		if (windStr.equals("Ю"))wind_id=5;
		if (windStr.equals("ЮЗ"))wind_id=6;
		if (windStr.equals("З"))wind_id=7;
		if (windStr.equals("СЗ"))wind_id=8;
		if (windStr.equals("Ш"))wind_id=9;
		return wind_id;
	}
	private JournalRow journalR;
	private List<JournalRow> weatherList = new ArrayList<JournalRow>();
	private Map<String, String> pogoda = new HashMap<String, String>();
	private List<String[]> city;
	private String startPointTemp = "</strong><br/><small>";
	private String Tag = "<td>";
	private String Procent = "%";
	private String Bolshe = ">";
	private String Menshe = "<";
	private String Kavychka = "\"";
	private String Zapyataya = ",";
	private String temp = "&deg;C</td>";
	private String Sky = "<td rowspan=\"3\" class=\"n\"><img border=\"0\" title=\"";
	private StringBuffer sbuf0;
	private String upToDate;
	private String windSpeedOut;
	private String tempOut;
	private String pressureOut;
	private String wetOut;
	private String skyOut;
	private String windOut;
	private int cloudiness = 0;
	private int indexSky = 0;
	private int indexStartPointTemp = 0;
	//private int forecastDay = 0;
	double precipitation = 0.0;
}
